perm filename HHTERM.FAI[CMS,LCS] blob sn#326489 filedate 1978-01-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		.INSERT	ASMBL.FAI[CMS,LCS]
C00003 00003	 Reset
C00005 00004	 REFRESH LOOP
C00007 00005	 WAIT LOOP AND SETUP
C00009 00006	 GEN CHR
C00010 00007	 RS232 INTERUPT ROUTINE
C00012 00008	 RS232 CONTROL
C00014 00009	 SCROLL DOWN
C00016 00010	 ASCII TABLE	BITS     7    6   5  4  3   2   1   0
C00021 ENDMK
C⊗;
	.INSERT	ASMBL.FAI[CMS,LCS]

	CPL ← = 28	;CHRS PER LINE
	NCHRS ← = 112	;CHRS PER SCREEN
	
; Zpage ram
	COL:	0
	CUR:	0
		0
	WINDOW:	0
		0

	TMP:	0
		0
	LINL:	0
	CHRL:	0

	BLOCK = 477

;	LOC 600
REBUF0:	0		;REFRESH BUFFER
	BLOCK = 128
;	LOC 1000
REBUF1:	0
	BLOCK = 128
;	LOC 1200
REBUF2:	0
	BLOCK = 128
;	LOC 1400
REBUF3:	0
	BLOCK = 128
;	LOC 1600
REBUF4:	0
	BLOCK = 128
	BLOCK = 1024

;	LOC 4000
ABUF:	0		;ASCII CHR BUF
; Reset
;	LOC 174000
	LOC 174274
	RSTA:	LDAI	377	;TURN OFF COLS
		STA	COLREG
		CLD		;CLEAR DECIMAL MODE
		LDXI	177	;STACK DEPTH
		TXS		;SETUP STACK

; SETUP AND CLEAR SCREEN
	;CLEAR ABUF, SETUP CURSOR AND WINDOW

	SD ← 10		;START OF ABUF
	ED ← 20		;END OF ABUF
		LDAI	0
		STAZ	CUR	;SETUP CURSOR
		LDAI	SD
		STAZ	CUR+1
		STAZ	WINDOW+1
		LDAI	=32	;NUMBER OF LINES IN MEM
		STAZ	WINDOW
	CLRM:	JSR	CR	;<cr> THEN CLEAR LINE *32
		JSR	LF
		JSR	CLRLIN	;OR JSR LF(CLRL)?
		DECZ	WINDOW
		BNE	CLRM	;WINDOW ← 0

		JSR	UPDATE	;CLEAR REBUF
; INIT I/O
  ;INIT RS232
	SIODEF ← 225	;UART CONTROL WORD
	ACIAC ← 77776	;UART CONTROL REG ADDRESS
	ACIAD ← 77777	;UART DATA REG ADDRESS
		LDAI	3	;RESET ACIA
		STA	ACIAC
		LDAI	SIODEF	;SETUP DEFAULT I/O CONTROL
		STA	ACIAC

  ;INIT KB SCANER
	KBD ← 23776	;KEYBOARD DATA REGISTER ADDRESS
	KBC ← 23777	;KEYBOARD CONTROL REGISTER ADDRESS
		LDAI	2	;KB DPY MODE SET
		STA	KBC
		LDAI	60	;KB CLK DIV
		STA	KBC

		LDAI	220	;WRITE DPY RAM ?
		STA	KBC
		SEC
		LDAI	376
	KBSCAN:	STA	KBD
		ROLA
		BCS	KBSCAN

		LDAI	2	;CLEAR KB INTERUPT ↓?
		STA	KBC

		LDAI	100	;READ KB ↑?
		STA	KBC

		CLI		;ENABLE INTERUPTS
; REFRESH LOOP
	NCHRS ← =112	;NUMBER OF CHRS ON SCREEN
	DPYSR ← 27777	;DISPLAY SHIFT REGISTER ADDRESS

		LDXI	NCHRS-1
	RELOOP:	LDAI	376
		STAZ	COL	;SETUP COL BIT 1

	SLOOP0:	LDAX	REBUF0	;PUT FIRST COL IN SHIFT
		STA	DPYSR	;REGISTER STARTING WITH LAST CHR
		DEX
		BPL	SLOOP0
		JSR	NXCOL	;TURN ON COL AND WAIT

	SLOOP1:	LDAX	REBUF1	;SECOND
		STA	DPYSR
		DEX
		BPL	SLOOP1
		JSR	NXCOL

	SLOOP2:	LDAX	REBUF2	;THIRD
		STA	DPYSR
		DEX
		BPL	SLOOP2
		JSR	NXCOL

	SLOOP3:	LDAX	REBUF3	;FORTH
		STA	DPYSR
		DEX
		BPL	SLOOP3
		JSR	NXCOL

	SLOOP4:	LDAX	REBUF4	;FIFTH
		STA	DPYSR
		DEX
		BPL	SLOOP4
		JSR	NXCOL

		JMP	RELOOP
; WAIT LOOP AND SETUP
	COLREG ← 33777	;COL ENABLE REGISTER ADDRESS
	CPL ← = 28	;NUMBER OF CHRS PER LINE

	NXCOL:	LDAZ	COL
		STA	COLREG	;TURN ON COL

		LDAZ	UPFLG
		BEQ	WAIT

		LDAI	0
		STAZ	UPFLG
		JSR	UPDATE
			;WAIT(BRIGHTNESS - UPDATE)
		JMP	NXCOL

	WAIT:		;WAIT(BRIGHTNESS)

	NXCOL:	SEC
		ROLZ	COL	;SHIFT FOR NEXT COL
		LDXI	NCHRS-1
		LDAI	377
		STA	COLREG	;TURN OFF COL
		RTS

; UPDATE SCREEN
	UPDATE:	LDAZ	WINDOW
		STAZ	TMP
		LDAZ	WINDOW+1
		STAZ	TMP+1
		LDAI	4	;NUMBER OF LINES PER SCREEN
		STAZ	LINL
		LDYI	0

	LLOOP:	LDAI	CPL
		STAZ	CHRL

	ULOOP:	LDXI	0
		LDAIX	TMP
		JSR	WCHR
		INY
		INCZ	TMP
		DECZ	CHRL
		BNE	ULOOP

		DECZ	TMP	;FOR 32 CHRS PER LINE
		LDAZ	TMP
		ANDI	340
		CLC
		ADCI	40	;NEXT LINE
		STAZ	TMP
		BCC	NOOF
		INCZ	TMP+1
		LDAZ	TMP+1
		CMPI	ED
		BNE	NOOF
		LDAI	SD
		STAZ	TMP+1
	NOOF:	DECZ	LINL
		BNE	LLOOP
		RTS
; GEN CHR
	WCHR:	TAX		;X ← ASCII CHR
		LDAX	CGEN0	;FILL REBUF COLS 0-4
		STAY	REBUF0
		LDAX	CGEN1
		STAY	REBUF1
		LDAX	CGEN2
		STAY	REBUF2
		LDAX	CGEN3
		STAY	REBUF3
		LDAX	CGEN4
		STAY	REBUF4
		RTS

; KB INTERUPT ROUTINE
	KBINT:	PHA		;SAVE REGS
		TXA
		PHA

	FLUSH:	LDX	KBD	;GET CHR FROM KB

;		LDA	KBC	;CK IF FIFO EMPTY?
;		ANDI	7
;		BNE	FLUSH

		LDAI	2	;CLEAR KB INTERUPT
		STA	KBC
		CLI

	WAIT:	LDA	ACIAC
		ANDI	2	;CHECK IF FULL
		BEQ	WAIT
		LDAX	ASCII	;CONVERT KB TO ASCCI
		STA	ACIAD	;OUTPUT IT

		PLA		;RESTORE REGS
		TAX
		PLA
		RTI		;RETURN
; RS232 INTERUPT ROUTINE
	UNDEF ← 377
	RSINT:	PHA		;SAVE REGS
		TXA
		PHA
		TYA
		PHA
		LDA	ACIAC	;GET UART STATUS
		ANDI	160	;PAR∨OV∨FE
		BEQ	GCHR
	ERROR:			;RECIVE ERROR
	GCHR:	LDA	ACIAD	;GET CHR FROM ACIA
		ANDI	177	;7 BITS

		CMPI	UNDEF	;
		BCC	SCNTRL
		CMPI	UNDEF	;
		BCS	SCNTRL

		LDXI	0
		STAIX	CUR	;STORE IN ABUF

	;CK IF IN WINDOW
		;WRITE CHR IN REBUF?
		; OR SET UPDATE FLAG?

	INCUR:	INCZ	CUR
		LDAZ	CUR
		ANDI	37
		CMPI	CPL
		BCC	LESS	;BRANCH IF STILL ON PAGE
		JSR	CR
		JSR	LF
		JSR	CLRLIN	;JSR LF(CLRL)?
	LESS:
		;CK FOR SCROLL
		;CK UPDATE? UPDATE LINE?

	RSRTRN:		;SHOW CURSOR?
		PLA		;RESTORE REGS
		TAY
		PLA
		TAX
		PLA
		RTI		;RETURN
; RS232 CONTROL
	SCNTRL:	CMPI	12	;<lf>
		BEQ	RLF
		CMPI	15	;<cr>
		BEQ	RCR
		CMPI	177	;<bspace>
		BEQ	RBS
		CMPI	UNDEF	;SCROLL UP
		BEQ	SCRLU
		CMPI	UNDEF	;SCROLL DOWN
		BEQ	SCRLD
		CMPI	UNDEF	;BRIGHTER
		BEQ	BRIGHT
		CMPI	UNDEF	;DIMMER
		BNE	RSRTRN
	;DIM?			HOME ∨ SET CUR?
		JMP	RSRTRN

	BRIGHT:
; <lf>
	RLF:	JSR	LF

		JSR	CLRLIN	;CLEAR LINE?
	;CK SCROLL
	;UPDATE? UPDATE LINE?
		JMP	RSRTRN

; <cr>
	RCR:	JSR	CR

	;UPDATE? ∨ UPDATE LINE? CHR?

		JMP	RSRTRN

; <bspace>
	RBS:	LDAZ	CUR
		BNE	NOBACK
		DECZ	CUR+1
		LDAZ	CUR+1
		CMPI	SD-1	;CK IF BEFORE BEGINING
		BNE	NOBACK
		LDAI	ED-1	;WRAP AROUND
		STAZ	CUR+1
		
	NOBACK:	DECZ	CUR
		LDAZ	CUR
		ANDI	37
		CMPI	CPL
		BCC	NORLF	;LESS THAN LINE LEN
		LDAZ	CUR
		ANDI	340
		ORAI	CPL-1
		STAZ	CUR

	NORLF:	LDAI	40	;<space>
		LDXI	0
		STAIX	CUR

	;CK SCROLL
	;CK UPDATE
		JMP	RSRTRN
; SCROLL DOWN
	SCRLD:	LDAZ	WINDOW
		CLC
		ADCI	40	;FOR ≤32 CHRS
		STAZ	WINDOW
		BCC	NOWA
		INCZ	WINDOW+1
		LDAZ	WINDOW+1
		CMPI	ED
		BNE	NOWA
		LDAI	SD
		STAZ	WINDOW+1
	NOWA:	INCZ	UPFLG	;SET UPDATE FLG
		JMP	RSRTRN

; SCROLL UP
	SCRLU:	LDAZ	WINDOW
		SEC
		SBCI	40	;≤32 CHRS PER LINE
		STAZ	WINDOW
		BCS	NOWA
		DECZ	WINDOW+1
		LDAZ	WINDOW+1
		CMPI	SD-1
		BNE	NOWA
		LDAI	ED-1
		STAZ	WINDOW+1
		JMP	NOWA

; <lf> SUBROUTINE
	LF:	LDAZ	CUR
		CLC
		ADCI	40
		STAZ	CUR
		BCC	NORA
		INCZ	CUR+1
		LDAZ	CUR+1
		CMPI	ED
		BNE	NORA
		LDAI	SD
		STAZ	CUR+1
	NORA:	RTS

; <cr> SUBROUTINE
	CR:	LDAZ	CUR
		ANDI	340
		STAZ	CUR
		RTS

; CLEAR LINE SUBROUTINE
	CLRLIN:	LDYI	CPL-1	;CLEAR LINE. # CHRS PER LINE
		LDAI	40	;<space>
	CLRL:	STAIY	CUR	;FILL CURSOR TO CURSOR + CPL
		DEY		;WITH SPACES
		BPL	CLRL
		RTS
; ASCII TABLE	BITS     7    6   5  4  3   2   1   0
;	LOC	175000	CNTL SHFT S2 S1 S0 RL2 RL1 RL0
	LOC	175324
ASCII:	"0"  ↔	"1"  ↔	"2"  ↔	"3"  ↔	"4"  ↔	"5"  ↔	"6"  ↔	"7"
	"8"  ↔	"9"  ↔	"A"  ↔	"B"  ↔	"C"  ↔	"D"  ↔	"E"  ↔	"F"
	"G"  ↔	"H"  ↔	"I"  ↔	"J"  ↔	"K"  ↔	"L"  ↔	"N"  ↔	"O"
	"P"  ↔	"Q"  ↔	"R"  ↔	"S"  ↔	"T"  ↔	"U"  ↔	"V"  ↔	"W"
	"X"  ↔	"Y"  ↔	"Z"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"

	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"

	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"

	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"
	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"  ↔	"@"

; CHRGEN			FONT = CAP7X5
;	LOC	176000
	LOC	176274
	CGEN0:	BLOCK = 128
	CGEN1:	BLOCK = 128
	CGEN2:	BLOCK = 128
	CGEN3:	BLOCK = 128
	CGEN4:	BLOCK = 128

; INTER VECTS
;	LOC 177772
	LOC 200266

	NMIV:	KBINT∧377	;NMIV:	ABSO KBINT
		370
	RSTV:	0		;RSTV:	ABSO RSTA
		370
	IRQV:	RSINT∧377	;IRQV:	ABSO RSINT
		370
	END